//表格控件调整   支持多实例模式  修改方法添加机制及callBack 
(function($){
	var hasDefSortQry=false;
	var rowClass='tableRow';
	var tableFunc={
		doSort:function(){
		
		},
		beforeSort:function(){
			
		}
	};
	var uqTime=new Date();
	var commonMap={
		instKey:'listTable'	
	};
	//表格通用事件  over
	function _table_over(){
		$(this).addClass("rowOver");
	}
	//out
	function _table_out(){
		$(this).removeClass("rowOver");
	}
	function bindQuery(key,type){
		//排序前处理	
		if(tableFunc.doSort){
			tableFunc.doSort.call({
				key:key,
				val:type
			});
		}
	}
	function beforeSort(){
		if(tableFunc.beforeSort){
			tableFunc.beforeSort.call({
				key:key,
				val:type
			});
		}
	}
	function bindAsc(e){
		$.stopEvent(e);
		beforeSort();
		var $this=$(this);
		var key=$this.attr("sortKey");
		$this.hide();
		$this.parent().find(".desc").show();
		bindQuery(key,'asc');
	}
	function bindDesc(e){
		$.stopEvent(e);
		beforeSort();
		var $this=$(this);
		var key=$this.attr("sortKey");
		$this.hide();
		$this.parent().find(".asc").show();
		bindQuery(key,'desc');
	}
	function doAscOrDesc(e){
		var pe=$(this);
		var asc=pe.find("li.asc");
		var desc=pe.find("li.desc");
		if(asc.get(0).style.display=="none"){
			desc.trigger("click");
		}
		else{
			asc.trigger("click");
		}
	}
	function bindSort(cfg,elem){
		var key=cfg.sortKey;
		//var span=$("<div class='table_sort' style='float:right' />");
		var asc=$("<li class='asc sort_li' title='降序' sortKey='"+key+"' ></li>").appendTo(elem);
		asc.bind({
			click:bindAsc
		});
		var desc=$("<li class='desc sort_li' title='升序' sortKey='"+key+"' ></li>").appendTo(elem);
		desc.bind({
			click:bindDesc
		});
		elem.bind("click",doAscOrDesc);
		elem.addClass("sortTd");
		if(cfg.sortByDefault){
			doAscOrDesc.call(elem);
			hasDefSortQry=true;
		}
		//elem.append(span);
	}
	function listTable(){
		this.curRowData=null;
		this.opt={
			//表头
			head:null,
			//头配置
			curCfg:null,
			//模板
			curTemp:null,
			//行事件处理配置
			event:null,
			data:null,
			clean:false
		};
		//行数据 根据ID 映射
		this.dataMap={};
		this.curRow=null;
		this.curData=null;
		this.curTable=null;
		//自定义绑定函数
		this.tableFunc={};
	};
	listTable.prototype={
		createHead:function(){
	  		var cfg=this.opt.curCfg;
	  		var elem=this.opt.head;
	  		//表头对象 保存关联 body  实现head 与 body 分离 
	  		elem.data("relaTable",this.curTable);
	  		for(var item in cfg){
	  			var temp=cfg[item];
	  			if(temp.noHead){
	  				continue;
	  			}
	  			else{
	  				var div=$("<div>").appendTo(elem);
	  				var name=temp["name"];
	  				var css=temp["css"];
	  				var headcss=temp["headcss"];
	  				div.html("<span>"+(name?name:"")+"</span>");
	  				if(headcss){
	  					div.css(headcss);
	  				}
	  				else if(css){
	  					div.css(css);
	  				}
	  				if(temp.sortKey){
	  					//排序
	  					bindSort(temp,div);
	  				}
	  			}
	  		}
	  		elem.children().get(elem.children().length-1).style.background="none";
	  	},
		fillRow:function(){
			var inst=this;
			this.curData=this.opt.data;
			if(this.opt.clean){
				this.curTable.empty();
				this.dataMap={};
			}
			$(this.curData).each(function(){
				inst.curRowData=this;
				inst.insertRow().appendTo(inst.curTable);
			});
		},
		$id:function(){
			return parseInt(Math.random()*1000)+uqTime.getTime();
		},
		insertRow:function(){
			var str="<div class='"+this.opt.curTemp.attr("class")+"'>"+this.opt.curTemp.html()+"</div>";
			var curRow=$(str);
			//统一以id做主键 对于没有id则 自动生成
			if(typeof(this.curRowData.id)=="undefined"){
				this.curRowData.id=this.$id();
			}
			curRow.attr("id","tb_"+this.curRowData.id);
			curRow.addClass(rowClass);
			curRow.bind("mouseover",_table_over);
			curRow.bind("mouseout",_table_out);
			curRow.bind(this.opt.event);
			this.fillSub(curRow);
			this.dataMap[this.curRowData.id]=this.curRowData;
			this.curRowData=null;
			return curRow;
		},
		fillSub:function(elem){
			var jtext=elem.attr("jtext");
			var temp=this.opt.curCfg[jtext];
			if(temp){
				if(temp.bindFunc){
					var retObj=this.fillRowByFunc(temp.bindFunc,jtext);
					if(retObj!=null&&retObj.length){
						elem.append(retObj);
					}
				}
				else{
					elem.text(this.curRowData[jtext]);
				}
			}
			if(temp&&temp.css){
				elem.css(temp.css);
			}
			var len=elem.children().length;
			for(var i=0;i<len;i++){
				this.fillSub($(elem.children().get(i)));
			}
		},
		fillRowByFunc:function(jtext,key){
			//优先取 对象本身 没有则取 通用配置
			if(this.tableFunc[jtext]){
				return this.tableFunc[jtext].call(this.curRowData,key);
			}else if(this.tableFunc[key]){
				return this.tableFunc[key].call(this.curRowData,key);
			}
			else if(tableFunc[jtext]){
				return tableFunc[jtext].call(this.curRowData,key);
			}
			else{
				return null;
			}
		},
		getId:function(elem){
			var id="";
	  		if(elem.hasClass(rowClass)){
	  			id=elem.attr('id');
	  		}
	  		else{
	  			id=elem.parents("."+rowClass).attr('id');
	  		}
	  		if(!id)
	  			return null;
	  		else
	  			return id.replace("tb_","");
		},
		getRowData:function(elem){
	  		return this.dataMap[this.getId(elem)];
	  	},
	  	//新增或修改单条数据 
	  	update:function(data){
	  		this.curRowData=data;
	  		var row=this.insertRow();
	  		var old=this.curTable.children("#tb_"+data.id);
	  		if(old.length){
	  			row.insertBefore(old);
	  			old.remove();
	  		}
	  		else{
				this.curTable.prepend(row);				
	  		}
	  		this.curRowData=null;
	  	},
	  	delRowData:function(id){
	  		this.curTable.children("#tb_"+id).remove();
	  	}
	};
	//表格控件
	$.fn.listTable=function(opt){
		var len=this.length;
		var elem;
		var inst;
		for(var i=0;i<len;i++){
			elem=$(this.get(i));
			inst=elem.data(commonMap.instKey);
			if(!inst){
				inst=new listTable();
				inst.opt=$.extend(inst.opt,opt);
				inst.curTable=elem;
				elem.data(commonMap.instKey,inst);
				if(inst.opt.head)
					inst.createHead();
			}
			else{
				inst.opt=$.extend(inst.opt,opt);
			}
			if(opt.data){
				inst.fillRow();
			}
		}
	};
	//提供tableFunc 的添加删除
	window.tableHandle={
		addFunc:function(key,obj,table){
			if(table&&table.length){
				table.data(commonMap.instKey).tableFunc[key]=obj;
			}
			else{
				tableFunc[key]=obj;
			}
		},
		//param 包含3个参数  table 方法名  参数 
		exec:function(param){
			return param.table.data(commonMap.instKey)[param.func](param.data);
		},
		//为简单表格组件添加绑定函数
		addSimpleFunc:function(key,func){
			simpleTable.funcMap[key]=func;
		},
		doSimple:function(opt){
			return simpleTable[opt.method](opt.param);
		}
	};
	//简单表格组件 根据head来处理
	var simpleTable={
		headJson:null,
		table:null,
		body:null,
		prefix:'_simple_',
		$id:function(tr){
			if(tr.length)
				tr=tr.get(0);
			return tr.id.replace(simpleTable.prefix,"");
		},
		init:function(t){
			this.table=t;
			this.body=t.children("tbody");
			this.headJson=[];
			t.children("thead").find("td").each(this.toJson);
			this.headLen=this.headJson.length;
		},
		toJson:function(){
			var temp=$(this);
			var obj={
				id:temp.attr("dateKey"),
				func:temp.attr("bindfunc")
			};
			simpleTable.headJson.push(obj);
		},
		hasFill:function(data){
			if(typeof(data.id)=="undefined")
				return false;
			var o=simpleTable.body.children("#"+simpleTable.prefix+data.id);
			if(o.length)
				return true;
			else
				return false;
		},
		fill:function(){
			var inst=simpleTable;
			//过滤重复数据
			if(simpleTable.hasFill(this))
				return;
			var tr=$("<tr>").appendTo(simpleTable.body);
			for(var i=0;i<simpleTable.headLen;i++){
				var td=$("<td>").appendTo(tr);
				if(inst.headJson[i].func){
					td.append(inst.doFunc(inst.headJson[i],this));
				}
				else{
					td.text(this[inst.headJson[i].id]);
				}
			}
			td.addClass("last_child");
			if(typeof(this.id)!="undefined"){
				tr.attr("id",simpleTable.prefix+this.id);
			}
		},
		doFunc:function(obj,data){
			if(this.funcMap[obj.func]){
				//调用函数 参数为 数据及配置信息
				return this.funcMap[obj.func].call(data,obj);
			}
			return "";
		},
		destroy:function(){
			this.headJson=null;
			this.table=null;
			this.body=null;
		},
		//绑定事件对象
		funcMap:{}
	};
	$.fn.table=function(data,clean){
		var t=$(this);
		if(clean){
			t.children("tbody").empty();
		}
		simpleTable.init(t);
		$(data).each(simpleTable.fill);
		simpleTable.destroy();
	};
	//列表组件
	$.fn.list=function(data,clean,param){
		var t=$(this);
		if(clean){
			t.attr("page",1);
			t.empty();
		}
		var key=t.attr("dataKey");
		key=key?key:"name";
		var len=data.length;
		for(var i=0;i<len;i++){
			var temp=$("<li></li>").appendTo(t);
			if(!param||!param.noTitle)
				temp.attr("title",data[i][key]);
			
			temp.attr("id","l_"+data[i].id)
			.data("data",data[i]);
			
			var func=t.attr("bindfunc");
			if(func){
				temp.append(yanhx.exec(func,data[i]));
			}else{
				temp.text(data[i][key]);
			}
		}
	};
})(jQuery);
